/* Es wird ein JFrame erzeugt  das
 * dann in das Dashboard eingebunden wird.
 *  
 * 
 * Datei: PersonVerwaltenGUI.java   Autor: Johannes Reinhard
 * Datum: 25.11.2011                   Version: 0.3 
 *
 */
package GUI;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import medienverwaltung.DatumParser;
import medienverwaltung.KeinDatumFormat;
import kommunikation.*;
import personenverwaltung.*;


public class PersonVerwaltenGUI 
{
  private JPanel jpanelPersonenVerwaltenGUI;        /* Haupt JPanel */
  private Dashboard sichereDashboard;
  private int nutzerID;
  private Personenverwaltung persverw;
  private WechselSprache sprache;
  private Benutzer nutzer;
  private JFrame person;
  protected Dimension bildschirm;  
  
  /* Buttons die zum speichern und zum bezahlen der Mahngebuehr
   * vorgesehen sind.
   */
  private JButton verwalten, mahngebuer_bezahlen;

  /* Diese JLabels sollen dem Nutzer helfen die
   * Benutzeroberflaeche zu verstehen. 
   */
  private JLabel id, geburtsname, telefonnummer,
  	 email, geburtstdatum,
  	 adresse, plz, titel, andrede, vorname, weitereVornamen,
  	 nachname, namenszusatz, strasse, hausnummer,
  	 postfach_plz, postfach_ort, postfach, art_anschrift,
  	 nutzerart,
  	 /* Rechte  */
  	 rechtAusleihen, rechtReservieren, rechtAusleihedauer, 
  	 rechtVerlaengerrungsdauer, rechtStatistik, rechtBibVis,
  	 mahngebuehr, txt_rechtmahngebuehr;

  /* Hier koennen Werte eingetragen werden die dann abgespeichert 
   * werden
   */
  private JTextField txt_id, txt_geburtsname, txt_Telefonnumer, 
  	txt_email, txt_geburtsdatum, txt_adresse, 
  	txt_plz, txt_vorname, txt_weitereVornamen, 
  	txt_nachname, txt_rechtAusleihedauer, 
  	txt_rechtVerlaengerrungsdauer, txt_mahngebuehr, 
  	txt_strasse, txt_hausnummer,
  	txt_postfach_plz, txt_postfach_ort, txt_postfach;
    
  /*
   * In diesen Checkboxen wird dem Benutzer visualisiert, dass 
   * etwas funktioniert oder ob es Probleme gibt.
   */
  private JCheckBox check_g_name, check_nummer, check_email, 
  	check_g_datum, check_adresse,
  	check_plz, check_vorname, check_w_vorname,
  	check_nachname, check_hausnummer, check_strasse, 
  	check_p_plz, check_p_ort,
  	check_p_postfache,
  	/* Diese Checkboxen sollen nicht angezeigt werden, da
  	 * es nicht moeglich ist etwas falsches 
  	 * anzugeben.
  	 */
  	platzhalter_1, platzhalter_2, platzhalter_3, 
  	platzhalter_4, platzhalter_5, platzhalter_6,
  	platzhalter_7, platzhalter_8, platzhalter_11, 
  	platzhalter_12, platzhalter_13, platzhalter_14, 
  	platzhalter_15, platzhalter_16;
  
  /*
   * In diesen ComoBoxen kann man verschiede Werten ausgewaehlen. 
   * Dies bedeutet das diese Werte bereits vorher 
   * feststehen.
   */
  private JComboBox <String> ausleihe, reservieren, rechtstatistik, 
        rechtStandort, txt_namenszusatz, 
  	txt_titel, txt_andrede, combo_mahngebuehr, wahlWohnsitz,
  	w_nutzerart;
  
  /*
   * Dieses Array ist fuer die Rechte vorgesehen, da es ausreicht das man
   * ein Recht hat (true) oder nicht (false).
   */
  private String[] janein;
  
  /*
   * Dieser Boolean Wert sorgt dafuer, dass man ein Fenster nur einmal 
   * oeffenen kann.
   */
  public static boolean geoeffnet = true;

  /**
   * Konstruktor der Klasse PersonVerwaltenGUI
   * @param bord
   */
  protected PersonVerwaltenGUI (Dashboard bord)
  {
    /* 
     * Wenn das Fenster schon geoeffnet, dann passiert nichts.
     */
    if (geoeffnet)
    {
      sichereDashboard = bord;
      nutzerID = Dashboard.nutzerID;
      persverw = sichereDashboard.persVer;
      sprache = Dashboard.sprache;
      nutzer = persverw.gibBenutzer (nutzerID);
      bildschirm = sichereDashboard.gibBildschirmgroesse ();
    	
      janein = new String [2];
      janein[0] = "false";
      janein[1] = "true";
      	
      erzeugePersonVerwaltenGUI ();	
    }
  }
  /**
   * Erzeuge eine Test JPanel das dann eingebunden wird
   */
  private void erzeugePersonVerwaltenGUI ()
  {
    jpanelPersonenVerwaltenGUI = new JPanel ();
    person = new JFrame ("Personverwaltung");
    
    /* Platzhalter, damit die ganzen 
     * JLabel nicht so nache am Rand stehen. */
    JPanel platz = new JPanel ();
  	
    /* Textfield mit informationen fuer den Nutzer */
    JTextArea info = new JTextArea ("\n\n" + 
	sprache.lokal.gibUebersetzung ("personenverwaltung"));
    info.setLineWrap(true);
    info.setWrapStyleWord(true);
    info.setEditable (false);
  	
    person.add (info, BorderLayout.NORTH);
    person.add (erzeugen (), BorderLayout.CENTER);
    person.add (platz, BorderLayout.WEST);
    dialog ();
    person.setSize (800, bildschirm.height 
	- sichereDashboard.gibGesamthoehe_leiste ());
  	
    /* Verhindert das das Fenster Stanardmaessig geschlossen
     * wird wenn die "windowClosing" Operation ausgefuehrt wurde.  */
    person.setDefaultCloseOperation 
      (WindowConstants.DO_NOTHING_ON_CLOSE);
      /* Was passiert wenn das Fenster geschlossen wird. */
      person.addWindowListener (new WindowAdapter() 
  	{
  	  public void windowClosing (WindowEvent e) 
  	  {
  	    /* Wenn ein Pflichtfeld nicht ausgefuellt ist, dann darf es 
  	     * nicht geschlossen werden.  */
  	    if (txt_vorname.getText ().equals ("") ||
  	        txt_nachname.getText ().equals (""))
  	    {
  	      pflichfelderAusfuellen ();
  	    }
  	    else
  	    {
  	      /* 
  	       * Fenster wird geschlossen und es wird ermoeglicht, dass 
  	       * man es nochmal wieder oeffnen kann.
  	       */
  	      geoeffnet = true;
  	      person.dispose ();
  	    }
  	  }
  	}
      );
  }
  
  /**
   * Elemente auf JPanel hinzufuegen
   * @return
   */
  private JPanel erzeugen ()
  {
    initalisieren ();
    JPanel panel_mahngebuehr;
    jpanelPersonenVerwaltenGUI.setLayout (new GridLayout (0, 3));
  	
    jpanelPersonenVerwaltenGUI.add (id);
    jpanelPersonenVerwaltenGUI.add (txt_id);
    jpanelPersonenVerwaltenGUI.add (platzhalter_1);
    jpanelPersonenVerwaltenGUI.add (geburtsname);
    jpanelPersonenVerwaltenGUI.add (txt_geburtsname);
    jpanelPersonenVerwaltenGUI.add (check_g_name);
    jpanelPersonenVerwaltenGUI.add (telefonnummer);
    jpanelPersonenVerwaltenGUI.add (txt_Telefonnumer);
    jpanelPersonenVerwaltenGUI.add (check_nummer);
    jpanelPersonenVerwaltenGUI.add (email);
    jpanelPersonenVerwaltenGUI.add (txt_email);
    jpanelPersonenVerwaltenGUI.add (check_email);
    jpanelPersonenVerwaltenGUI.add (geburtstdatum);
    jpanelPersonenVerwaltenGUI.add (txt_geburtsdatum);
    jpanelPersonenVerwaltenGUI.add (check_g_datum);
    jpanelPersonenVerwaltenGUI.add (art_anschrift);
    jpanelPersonenVerwaltenGUI.add (wahlWohnsitz);
    jpanelPersonenVerwaltenGUI.add (platzhalter_14);
    jpanelPersonenVerwaltenGUI.add (hausnummer);
    jpanelPersonenVerwaltenGUI.add (txt_hausnummer);
    jpanelPersonenVerwaltenGUI.add (check_hausnummer);
    jpanelPersonenVerwaltenGUI.add (strasse);
    jpanelPersonenVerwaltenGUI.add (txt_strasse);
    jpanelPersonenVerwaltenGUI.add (check_strasse);
    jpanelPersonenVerwaltenGUI.add (adresse);
    jpanelPersonenVerwaltenGUI.add (txt_adresse);
    jpanelPersonenVerwaltenGUI.add (check_adresse);
    jpanelPersonenVerwaltenGUI.add (plz);
    jpanelPersonenVerwaltenGUI.add (txt_plz);
    jpanelPersonenVerwaltenGUI.add (check_plz);
    jpanelPersonenVerwaltenGUI.add (postfach);
    jpanelPersonenVerwaltenGUI.add (txt_postfach);
    jpanelPersonenVerwaltenGUI.add (check_p_postfache);
    jpanelPersonenVerwaltenGUI.add (postfach_ort);
    jpanelPersonenVerwaltenGUI.add (txt_postfach_ort);
    jpanelPersonenVerwaltenGUI.add (check_p_ort);
    jpanelPersonenVerwaltenGUI.add (postfach_plz);
    jpanelPersonenVerwaltenGUI.add (txt_postfach_plz);
    jpanelPersonenVerwaltenGUI.add (check_p_plz);
    jpanelPersonenVerwaltenGUI.add (titel);
    jpanelPersonenVerwaltenGUI.add (txt_titel);
    jpanelPersonenVerwaltenGUI.add (platzhalter_2);
    jpanelPersonenVerwaltenGUI.add (andrede);
    jpanelPersonenVerwaltenGUI.add (txt_andrede);
    jpanelPersonenVerwaltenGUI.add (platzhalter_3);
    jpanelPersonenVerwaltenGUI.add (vorname);
    jpanelPersonenVerwaltenGUI.add (txt_vorname); 
    jpanelPersonenVerwaltenGUI.add (check_vorname);
    jpanelPersonenVerwaltenGUI.add (weitereVornamen);
    jpanelPersonenVerwaltenGUI.add (txt_weitereVornamen);
    jpanelPersonenVerwaltenGUI.add (check_w_vorname);
    jpanelPersonenVerwaltenGUI.add (nachname);
    jpanelPersonenVerwaltenGUI.add (txt_nachname);
    jpanelPersonenVerwaltenGUI.add (check_nachname);
    jpanelPersonenVerwaltenGUI.add (namenszusatz);
    jpanelPersonenVerwaltenGUI.add (txt_namenszusatz);
    jpanelPersonenVerwaltenGUI.add (platzhalter_4);

    /* 
     * Wenn der agemeldete Benutzer die noetigen Rechtw hat werden
     * diese Elemente eingeblendet.
     */
    if (nutzer.gibRechte ().darfMahngebuehrKassieren ())
    {
      jpanelPersonenVerwaltenGUI.add (mahngebuehr);
      panel_mahngebuehr = new JPanel ();
      panel_mahngebuehr.setLayout (new GridLayout (0, 2));
      panel_mahngebuehr.add (txt_mahngebuehr);
      panel_mahngebuehr.add (mahngebuer_bezahlen);
      jpanelPersonenVerwaltenGUI.add (panel_mahngebuehr);
      jpanelPersonenVerwaltenGUI.add (platzhalter_15);
    }
  	
    /* Mitarbeiter darf z.B. nicht die Moeglichkeit habe
     * sich zum Administrator zu machen.
     */
    if (nutzer.istAdministrator ())
    {
      jpanelPersonenVerwaltenGUI.add (nutzerart);
      jpanelPersonenVerwaltenGUI.add (w_nutzerart);
      jpanelPersonenVerwaltenGUI.add (platzhalter_16);
    }
    
    if (nutzer.gibRechte ().darfRechteVeraendern ())
    {
      jpanelPersonenVerwaltenGUI.add (rechtAusleihedauer); 
      jpanelPersonenVerwaltenGUI.add (txt_rechtAusleihedauer);
      jpanelPersonenVerwaltenGUI.add (platzhalter_5);
      jpanelPersonenVerwaltenGUI.add (rechtVerlaengerrungsdauer); 
      jpanelPersonenVerwaltenGUI.add (txt_rechtVerlaengerrungsdauer);
      jpanelPersonenVerwaltenGUI.add (platzhalter_6);
      jpanelPersonenVerwaltenGUI.add (rechtAusleihen); 
      jpanelPersonenVerwaltenGUI.add (ausleihe);
      jpanelPersonenVerwaltenGUI.add (platzhalter_7);
      jpanelPersonenVerwaltenGUI.add (rechtReservieren); 
      jpanelPersonenVerwaltenGUI.add (reservieren);
      jpanelPersonenVerwaltenGUI.add (platzhalter_8);
      jpanelPersonenVerwaltenGUI.add (rechtStatistik); 
      jpanelPersonenVerwaltenGUI.add (rechtstatistik); 
      jpanelPersonenVerwaltenGUI.add (platzhalter_11);
      jpanelPersonenVerwaltenGUI.add (rechtBibVis);
      jpanelPersonenVerwaltenGUI.add (rechtStandort); 
      jpanelPersonenVerwaltenGUI.add (platzhalter_12);
      jpanelPersonenVerwaltenGUI.add (txt_rechtmahngebuehr);
      jpanelPersonenVerwaltenGUI.add (combo_mahngebuehr);
      jpanelPersonenVerwaltenGUI.add (platzhalter_13);
    }
    
    platzhalterSetzen ();
    
    jpanelPersonenVerwaltenGUI.add (verwalten, BorderLayout.EAST);
    
    /* Da man nur eines haben kann wird das andere ausgeblendet */
    wahlWohnsitz.addItemListener ( 
	new ItemListener () 
	{
	  public void itemStateChanged (ItemEvent e) 
	  {
	    /* Erzeugt ein OBkjekt das zur Sprache gehoert. */
	    if (wahlWohnsitz.getSelectedItem ().
		equals (sprache.lokal.gibUebersetzung ("fach")))
	    {
	      /* ist fuer Postfach erforderlich */
	      txt_postfach_plz.setEditable (true); 
	      txt_postfach_ort.setEditable (true); 
	      txt_postfach.setEditable (true); 
	      /* ist nicht fuer Postfach erforderlich */
	      txt_strasse.setEditable (false);
	      txt_hausnummer.setEditable (false);
	      txt_adresse.setEditable (false); 
	      txt_plz.setEditable (false); 
	      txt_strasse.setText("");
	      txt_hausnummer.setText("");
	      txt_adresse.setText("");
	      txt_plz.setText("");
	      person.repaint ();
	    }
	    if (wahlWohnsitz.getSelectedItem ().
		equals (sprache.lokal.gibUebersetzung ("wohnsitz")))
	    {
	      /* ist fuer Wohnsitz erforderlich */
	      txt_strasse.setEditable (true); 
	      txt_hausnummer.setEditable (true); 
	      txt_adresse.setEditable (true);  
	      txt_plz.setEditable (true); 
	      /* ist nichts fuer Wohnsitz erforderlich */
	      txt_postfach_plz.setEditable (false); 
	      txt_postfach_ort.setEditable (false); 
	      txt_postfach.setEditable (false); 
	      txt_postfach_plz.setText("");
	      txt_postfach_ort.setText("");
	      txt_postfach.setText("");
	      person.repaint ();
	    }
	    if (wahlWohnsitz.getSelectedItem ().equals (""))
	    {
	      /* Wenn Benutzer nichts ausgewaehlt hat, dann ist keine
	       *  Eingabe moeglich.  */
	      txt_strasse.setEditable (false); 
	      txt_hausnummer.setEditable (false); 
	      txt_adresse.setEditable (false);  
	      txt_plz.setEditable (false); 
	      txt_postfach_plz.setEditable (false); 
	      txt_postfach_ort.setEditable (false); 
	      txt_postfach.setEditable (false); 
	      txt_strasse.setText("");
	      txt_hausnummer.setText("");
	      txt_adresse.setText("");
	      txt_plz.setText("");
	      txt_postfach_plz.setText("");
	      txt_postfach_ort.setText("");
	      txt_postfach.setText("");
	      person.repaint ();
	    }
	  }
        } 
      );
  	
    return jpanelPersonenVerwaltenGUI;
  }
  
  /**
   * Initalisiert alle Swing Komponenten
   */
  
  private void initalisieren ()
  {
    id = new JLabel ("ID: ");
    geburtsname = new JLabel ("Geburtsname: ");
    telefonnummer = new JLabel ("Telefonnumer: ");
    email = new JLabel ("E-Mail: ");
    geburtstdatum = new JLabel ("Geburtsdatum: ");
    art_anschrift = new JLabel ("Art der Anschrift: ");
    adresse = new JLabel ("Adresse: ");
    plz = new JLabel ("PLZ");
    titel  = new JLabel ("Titel: ");
    andrede = new JLabel ("Andrede: ");
    vorname = new JLabel ("Vorname: ");
    weitereVornamen = new JLabel ("Weitere Vornamen: ");
    nachname = new JLabel ("Nachname: ");
    namenszusatz = new JLabel ("Namenszusatz: ");
    mahngebuehr = new JLabel ("Mahngebuehr: ");
    hausnummer = new JLabel ("Hausnummer: ");
    strasse = new JLabel ("Strasse: ");
    postfach = new JLabel ("Postfache: ");
    postfach_ort = new JLabel ("Postfachort :");
    postfach_plz = new JLabel ("Postfach PLZ: ");
    nutzerart = new JLabel ("Nutzerart: ");
    
    /* Rechte */
    rechtAusleihen = new JLabel ("Recht (Ausleihen)");
    rechtReservieren = new JLabel ("Recht (Rervieren)");
    rechtAusleihedauer = new JLabel ("Recht (Ausleihdauer)");
    rechtVerlaengerrungsdauer = new JLabel ("Recht (Verlaengerung)");
    rechtStatistik = new JLabel ("Recht (Statistik)");
    rechtBibVis= new JLabel ("Recht (BibVis");
    txt_rechtmahngebuehr = new JLabel ("Recht (Mahngebuehr)");

    txt_id  = new JTextField ();
    txt_geburtsname = new JTextField ();
    txt_Telefonnumer = new JTextField ();
    txt_email = new JTextField ();
    txt_geburtsdatum = new JTextField ();
    txt_adresse = new JTextField ();
    txt_plz = new JTextField ();
    txt_vorname  = new JTextField ();
    txt_weitereVornamen = new JTextField ();
    txt_nachname = new JTextField ();
    
    /* Mahngebuehr kann nur von System geandert werden. */
    txt_mahngebuehr = new JTextField ("0");
    txt_mahngebuehr.setEditable (false);
    
    /* Geburtsdatum darf nicht geaendert werden. */
    txt_geburtsdatum.setEditable (false);
    
    txt_hausnummer = new JTextField ();
    txt_strasse = new JTextField ();
    txt_postfach = new JTextField ();
    txt_postfach_ort = new JTextField ();
    txt_postfach_plz = new JTextField ();
    
    /* Rechte werden zwar angezeigt sind
     *  aber von Nutzer nicht aenderbar */
    txt_rechtAusleihedauer = new JTextField ();
    txt_rechtVerlaengerrungsdauer = new JTextField ();
    txt_rechtAusleihedauer.setEditable (false);
    txt_rechtVerlaengerrungsdauer.setEditable (false);
    
    ausleihe = new JComboBox <String> (janein);
    reservieren = new JComboBox <String> (janein);
    rechtstatistik = new JComboBox <String> (janein);
    rechtStandort = new JComboBox <String> (janein);
    combo_mahngebuehr = new JComboBox <String> (janein);
    
    check_g_name = new JCheckBox ();
    check_nummer = new JCheckBox ();
    check_email = new JCheckBox ();
    check_g_datum = new JCheckBox ();
    check_adresse = new JCheckBox ();
    check_plz = new JCheckBox ();
    check_vorname = new JCheckBox ();
    check_w_vorname = new JCheckBox ();
    check_nachname = new JCheckBox ();
    check_hausnummer = new JCheckBox ();
    check_strasse = new JCheckBox ();
    check_p_ort = new JCheckBox ();
    check_p_plz = new JCheckBox ();
    check_p_postfache = new JCheckBox ();
    platzhalter_1 = new JCheckBox ();
    platzhalter_2 = new JCheckBox ();
    platzhalter_3 = new JCheckBox ();
    platzhalter_4 = new JCheckBox ();
    platzhalter_5 = new JCheckBox ();
    platzhalter_6 = new JCheckBox ();
    platzhalter_7 = new JCheckBox ();
    platzhalter_8 = new JCheckBox ();
    platzhalter_11 = new JCheckBox ();
    platzhalter_12 = new JCheckBox ();
    platzhalter_13 = new JCheckBox ();
    platzhalter_14 = new JCheckBox ();
    platzhalter_15 = new JCheckBox ();
    platzhalter_16 = new JCheckBox ();
    
    check_g_name.setEnabled (false);
    check_nummer.setEnabled (false);
    check_email.setEnabled (false);
    check_g_datum.setEnabled (false);
    check_adresse.setEnabled (false);
    check_plz.setEnabled (false);
    check_vorname.setEnabled (false);
    check_w_vorname.setEnabled (false);
    check_nachname.setEnabled (false);
    check_hausnummer.setEnabled (false);
    check_strasse.setEnabled (false);
    check_p_ort.setEnabled (false);
    check_p_plz.setEnabled (false);
    check_p_postfache.setEnabled (false);
    
    /* Lokalisierung */
    geburtsname.setText (
	sprache.lokal.gibUebersetzung ("geburtsname"));
    telefonnummer.setText (
	sprache.lokal.gibUebersetzung ("telefonnummer"));
    email.setText (
	sprache.lokal.gibUebersetzung ("email"));
    geburtstdatum.setText (
	sprache.lokal.gibUebersetzung ("geburtsdatum"));
    art_anschrift.setText (
	sprache.lokal.gibUebersetzung ("anschrift"));
    titel.setText (
	sprache.lokal.gibUebersetzung ("titel"));
    andrede.setText (
	sprache.lokal.gibUebersetzung ("anrede"));
    vorname.setText (
	sprache.lokal.gibUebersetzung ("vorname"));
    weitereVornamen.setText (
	sprache.lokal.gibUebersetzung ("weiterevornamen"));
    nachname.setText (
	sprache.lokal.gibUebersetzung ("nachname"));
    namenszusatz.setText (
	sprache.lokal.gibUebersetzung ("namenszusatz"));
    strasse.setText (
	sprache.lokal.gibUebersetzung ("strasse"));
    hausnummer.setText (
	sprache.lokal.gibUebersetzung ("hausnummer"));
    adresse.setText (
	sprache.lokal.gibUebersetzung ("adresse"));
    plz.setText (
	sprache.lokal.gibUebersetzung ("plz"));
    mahngebuehr.setText (
	sprache.lokal.gibUebersetzung ("mahngebuehr"));
    postfach.setText (
	sprache.lokal.gibUebersetzung ("postfach")); 
    postfach_ort.setText (
	sprache.lokal.gibUebersetzung ("postfachOrt")); 
    postfach_plz.setText (
        sprache.lokal.gibUebersetzung ("postfachPLZ")); 
    nutzerart.setText (
        sprache.lokal.gibUebersetzung ("nutzerart"));
    
    rechtAusleihen.setText (
	sprache.lokal.gibUebersetzung ("r_ausleihen"));
    rechtReservieren.setText (
	sprache.lokal.gibUebersetzung ("reservieren"));
    rechtAusleihedauer.setText (
	sprache.lokal.gibUebersetzung ("ausleihdauer"));
    rechtVerlaengerrungsdauer.setText (
	sprache.lokal.gibUebersetzung ("verlaengerung")); 
    rechtStatistik.setText (
	sprache.lokal.gibUebersetzung ("statistik"));
    rechtBibVis.setText (
	sprache.lokal.gibUebersetzung ("bibvis"));
    mahngebuehr.setText (
	sprache.lokal.gibUebersetzung ("mahngebuehr"));
    txt_rechtmahngebuehr.setText (
	sprache.lokal.gibUebersetzung ("r_mahngebuehr"));
    
    /* Namenszusaetze aus Enum einlesen */
    
    txt_namenszusatz = new JComboBox <String> ();
    for (Namenszusatz g : Namenszusatz.values ()) 
    {
      txt_namenszusatz.addItem (g.toString ());
    }
    
    /* Titel aus Enum einlesen */
    txt_titel = new JComboBox <String> ();
    txt_titel.addItem (" ");
    for (Titel g : Titel.values ()) 
    {
      txt_titel.addItem (g.toString ());
    }
    
    /* Anreden aus Enum einlesen */
    txt_andrede = new JComboBox <String> ();
    for (Anrede g : Anrede.values ()) 
    {
      txt_andrede.addItem (g.toString ());
    }
    
    /*
     * Diese Auswahl ermoeglicht es dem Benutzer, dass er z.B.
     * einen anderen Benutzer zum Administrtor macht. 
     */
    w_nutzerart = new JComboBox<String> ();
    w_nutzerart.addItem ("");
    w_nutzerart.addItem ("Administrator");
    w_nutzerart.addItem ("Mitarbeiter");
    w_nutzerart.addItem ("Student");	
		
    /* Adresstyp auswaehlen. */
    String[] wahl = {"",
	sprache.lokal.gibUebersetzung ("wohnsitz"),
	sprache.lokal.gibUebersetzung ("fach") };
    wahlWohnsitz = new JComboBox <String> (wahl);
		
    /* Alle aenderungen werden gespeichert */
    verwalten = new JButton (sprache.lokal.gibUebersetzung ("verwalten"));
    verwalten.addActionListener (
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e)
	  {
	    nutzerSpeichern (nutzer);
	  }
	}
      );
	
    /* Es kann ein beliebiger Wert bezahlt werden und dieser wird
     *  dann auf das Konto des Benutzers gebucht. */
    mahngebuer_bezahlen = new JButton (
	sprache.lokal.gibUebersetzung ("mahn_aendern"));
    mahngebuer_bezahlen.addActionListener (
	new ActionListener ()
	{
	  public void actionPerformed (ActionEvent e)
	  {
	    try
	    {
	      String eingabe = JOptionPane.showInputDialog (
		  sprache.lokal.gibUebersetzung ("mahn_aendern"));
	      /* Mahngebuehr aendern */
	      double zahl  = Double.parseDouble( 
		  eingabe.replace (',','.')) ;
	      nutzer.mahngebuehrBezahlen (zahl);
	    }
	    catch (Exception ex)
	    {
	      /* Bei jeder Art von Exception ist es nicht moeglich 
	       * die Mahngebuehr zu bezahlen
	       */
	      fehlerdialog (
		Dashboard.sprache.lokal.
			gibUebersetzung ("mahngebuehr_bezhalen"),
		Dashboard.sprache.lokal.
			gibUebersetzung ("fehler"));
	    }
	  }
	}
      );
  }
  
  /**
   * Diese Methode dient dem Dialog mit dem Nutzer. Er hat
   * die Moeglichkeit sich zwischen verschiedenen Ansichten 
   * zu entscheiden.Es besteht die Moeglichkeit z.B. sich einen
   * Nutzer anzuzeigen.
   */
  private void dialog ()
  {
    try
    {
      int id = 0;
      int eingabe;
      
      /* Nutzer muss sich erst entscheiden was er abspeichert */
      txt_adresse.setEditable (false); 
      txt_plz.setEditable (false); 
      txt_hausnummer.setEditable (false);
      txt_strasse.setEditable (false);
      txt_postfach.setEditable (false);
      txt_postfach_ort.setEditable (false);
      txt_postfach_plz.setEditable (false);
      
      /* Logindaten einlesen 
       * Um zu testen ob ein neuer Benutzer angelegt werden kann. */
      id = idAbfrage ();
      nutzer = sichereDashboard.persVer.gibBenutzer (id);
      txt_id.setEditable (false);
       
      if(nutzer == null)
      {
	eingabe = JOptionPane.showConfirmDialog(null,
	    Dashboard.sprache.lokal.gibUebersetzung ("frageNutzer") ,
	    Dashboard.sprache.lokal.gibUebersetzung ("neuerNutzer"),
	    JOptionPane.YES_NO_OPTION);	
	
      	/*  Anwort Ja ausgewaehlt */
      	if (eingabe == JOptionPane.YES_OPTION)
      	{
      	  /* Setzte Geburtstdatum. Muss hier gemacht werden, da 
      	   * "setzeGeburtstdaum" private ist. */
      	  geburtstagsabfrage ();
      		
      	  /* Neu erzeugte ID in das ID Feld schreiben  */
      	  txt_id.setText (nutzer.gibId () + "");
      	  
      	  /* Felder fuer neuen Benutzer leeren */
      	  felderLehren ();
      	  checkBoxensetzen (false);
      	  
      	  /* Fuer neuen Nutzer die beiden bereits feststehenden Werte
      	   * setzen */
      	  person.setVisible (true);
      	  nutzerAnsehen ();
      	}
      		
      	/*  Anwort Nein ausgewaehlt */
      	if (eingabe == JOptionPane.NO_OPTION)
      	{
      		person.setVisible (false);
      	  checkBoxensetzen (false);
      	}
      	
      	/* Der Nutzer schliesst den Dialog */
      	if (eingabe == JOptionPane.CANCEL_OPTION)
        {
          person.setVisible (false);
          checkBoxensetzen (false);
        }
      }
      else 
      {
        /* ein ausgewaehlter Benutzer wird angezeigt. */
        person.setVisible (true);
      	nutzerAnsehen ();
      }
    }
    catch (Exception e)
    {
    }
  }
  
  /**
   * In dieser Methode werden alle Nutzerdaten geladen.
   */
  private void nutzerAnsehen ()
  {
    Adresse  a = nutzer.gibHauptAdresse ();
    
    if (a != null)
    {
      /* Wenn ein Postfach vorhanden, dann kann keine normale Adresse 
       * angegeben werden. */
      if (a.getClass ().getName ().endsWith (("Postfachadresse")))
      {
        txt_adresse.setEditable (false); 
        txt_plz.setEditable (false); 
        txt_hausnummer.setEditable (false);
        txt_strasse.setEditable (false);
        
        txt_postfach.setEditable (true);
        txt_postfach_ort.setEditable (true);
        txt_postfach_plz.setEditable (true);
        
        /* Adresse(PLZ,Strasse...usw) ausgeben  */
        txt_postfach.setText (((Postfachadresse)a).gibPostfach () + "");
        txt_postfach_ort.setText (a.gibOrt ());
        txt_postfach_plz.setText (a.gibPLZ () + "");
        wahlWohnsitz.setSelectedItem (
            sprache.lokal.gibUebersetzung ("fach"));
        
      }
      
      /* Wenn ein Wohnsitzadresse vorhanden, dann kann kein Postfach 
       * angegeben werden. */
      if (a.getClass ().getName ().endsWith (("Wohnsitzadresse")))
      {
        txt_adresse.setEditable (true); 
        txt_plz.setEditable (true); 
        txt_hausnummer.setEditable (true);
        txt_strasse.setEditable (true);
        
        txt_postfach.setEditable (false);
        txt_postfach_ort.setEditable (false);
        txt_postfach_plz.setEditable (false);
        
        txt_adresse.setText (a. gibOrt ()); 
        txt_plz.setText (a.gibPLZ () + "");
        txt_hausnummer.setText (
            ((Wohnsitzadresse)a).gibGesamteHausnummer ());
        txt_strasse.setText (((Wohnsitzadresse)a).gibStrasse ());
        wahlWohnsitz.setSelectedItem (
            sprache.lokal.gibUebersetzung ("wohnsitz"));
      }
    }
  	
    /* Geburtstname wird geladen */
    txt_geburtsname.setText (nutzer.gibGeburtsname ()); 	
    
    /* TRelefonnumer wird geladen */
    try
    {
      txt_Telefonnumer.setText (
	  nutzer.gibTelefonnummernListe ().get (0).gibTelefonnummer ()); 
      txt_email.setText (nutzer.gibEmailListe ().get (0).gibEmail ());
    }
    catch (IndexOutOfBoundsException e)
    {
    }
		
    /* Formatiere Geburtstdatum */
    Datum datum = nutzer.gibGebDatum ();
    txt_geburtsdatum.setText (datum.gibTag () + "." +
	datum.gibMonat () + "." + datum.gibJahr ()); 
		
    /* Comp Boxen fuellen und falls keine Werte vorhanden nichts tun. */
    try
    {
      txt_titel.setSelectedItem (nutzer.gibTitel ().toString ());
    }
    catch (NullPointerException e)
    {
    }
    try
    {
      txt_andrede.setSelectedItem (nutzer.gibAnrede ().toString ());
    }
    catch (NullPointerException e)
    {
    }
    try
    {
      txt_namenszusatz.setSelectedItem (nutzer.gibNamenszusatz ()
          .toString ());
    }
    catch (NullPointerException e)
    {
    }
    
    /* Weitere Nutzerdaten werden geladen */
    txt_vorname.setText (nutzer.gibVornamen ());  			
    txt_weitereVornamen.setText (nutzer.gibWeitereVornamen ()); 
    txt_nachname.setText (nutzer.gibNachname ()); 
    txt_rechtAusleihedauer.setText (
	nutzer.gibRechte ().gibAusleihdauer () + ""); 
    txt_rechtVerlaengerrungsdauer.setText (
	nutzer.gibRechte ().gibVerlaengerungsdauer () + ""); 	
    txt_mahngebuehr.setText (nutzer.gibMahngebuehr () + "");
		
    /* Benutzerart wird geladen (z.B. wird angezeigt das er ein
     * Administrator ist).
     */
    if (nutzer.istAdministrator ())
    {
      w_nutzerart.setSelectedItem ("Administrator");
    }
    if(nutzer.istMitarbeiter ())
    {
      w_nutzerart.setSelectedItem ("Mitarbeiter");
    }
    if(nutzer.istStudent ())
    {
      w_nutzerart.setSelectedItem ("Student");
    }
    
    /* Rechte werden angezeigt, wenn vorhanden dann true und 
     * wenn nicht dann false.
     */
    if (nutzer.gibRechte ().darfAusleihen ())
    {
      ausleihe.setSelectedItem ("true"); 
    }
    else
    {
      ausleihe.setSelectedItem ("false"); 
    }
    if (nutzer.gibRechte ().darfBibVisVerwalten ())
    {
      rechtStandort.setSelectedItem ("true"); 
    }
    else
    {
      rechtStandort.setSelectedItem ("false"); 
    }
    if (nutzer.gibRechte ().darfReservieren ())
    {
      reservieren.setSelectedItem ("true"); 
    }
    else
    {
      reservieren.setSelectedItem ("false"); 
    }
    if (nutzer.gibRechte ().darfStatistikAnsehen ())
    {
      rechtstatistik.setSelectedItem ("true"); 
    }
    else
    {
      rechtstatistik.setSelectedItem ("false"); 
    }
    if (nutzer.gibRechte ().darfMahngebuehrKassieren ())
    {
      combo_mahngebuehr.setSelectedItem ("true"); 
    }	 	
    else
    {
      combo_mahngebuehr.setSelectedItem ("false"); 
    }
    /* Wenn dieser Wert false gesetzt ist darf das Fenster kein 
     * zweites mal geoeffnet werden.
     */
    geoeffnet = false;
  }
  
  /**
   * In dieser Methode werden alle Nutzerdaten gespeichert und wenn
   * Felder nicht ausgefuellt sind gibt es eine Fehlermeldungen.
   */
  private void nutzerSpeichern (Benutzer benutzer)
  {
    /*Initalisierung */
    List<Telefonnummer> telefonnumernliste;
    Telefonnummer nummer;
    String plz;
    String postfach;
    int laenge;
    List<Email> emailliste;
    Email mail;
    
    /* Rechte */
    boolean rechtAusleihe;
    boolean rechtReservieren;
    boolean rechtStatistik;
    boolean rechtStand;
    boolean rechtMahngebuehr;
    
    try
    {
      /* Es muss bei jedem Speicherversuch geschaut werden
       * ob die Werte immer noch passen. */
      checkBoxensetzen (false);
      
      if (txt_geburtsname.getText ().equals (""))
      {
	check_g_name.setSelected (false);
      }
      else
      {
	nutzer.setzeGeburtsname (txt_geburtsname.getText ());
	check_g_name.setSelected (true);
      }
      
      /* Telefonnumer hinzufuegen */
      if (txt_Telefonnumer.getText ().equals (""))
      {
      }
      else
      {
	telefonnumernliste = new ArrayList<Telefonnummer> ();   	
	nummer = new Telefonnummer (txt_Telefonnumer.getText ());
	telefonnumernliste.add (nummer);
	nutzer.setzeTelefonnummernListe (telefonnumernliste);
	check_nummer.setSelected (true);
      }
      
      /* E-Mail */
      if (txt_email.getText ().equals (""))
      {
	check_email.setSelected (false);
      }
      else
      {
	emailliste = new ArrayList<Email> ();   	
	mail = new Email (txt_email.getText ());
	emailliste.add (mail);
	nutzer.setzeEmailListe (emailliste);
	check_email.setSelected (true);
      }
      
      
      /* Fals noch kein Wohnsitz, Postfach angegeben, dann wird dieser
       * hinzugefuegt.
       * Sobald ein wert eingetragen wurde muessen auch noch andere 
       * Felder gefuellt sein. */
      
      laenge = txt_plz.getText ().length() +
	  txt_strasse.getText ().length() +
	  txt_adresse.getText ().length() +
	  txt_hausnummer.getText ().length();
           
      if (laenge > 0)
      {
	if (txt_plz.getText ().equals ("") ||
	    txt_strasse.getText ().equals ("") ||
	    txt_adresse.getText ().equals ("") ||
	    txt_hausnummer.getText ().equals (""))
	{
     	  fehlerdialog(
     	      Dashboard.sprache.lokal.gibUebersetzung ("alleWohnsitz"),
     	      Dashboard.sprache.lokal.gibUebersetzung ("fehler"));
     	}
     	else
     	{
       	  plz = txt_plz.getText ();
       	  nutzer.wohnsitzadresseHinzufuegen (
       		txt_adresse.getText (), plz, txt_strasse.getText (),
       	  txt_hausnummer.getText ());
       	  
       	  check_adresse.setSelected (true);
       	  check_strasse.setSelected (true);
       	  check_hausnummer.setSelected (true);
       	  check_plz.setSelected (true);
     	}
      }
   	    
      /* Sobald ein wert eingetragen wurde muessen auch noch andere 
       * Felder gefuellt sein. */
        
      laenge = txt_postfach_plz.getText ().length() +
      txt_postfach.getText ().length() +
      txt_postfach_ort.getText ().length();
      if (laenge > 0)
      {
	if (txt_postfach_plz.getText ().equals ("") ||
	    txt_postfach.getText ().equals ("") ||
	    txt_postfach_ort.getText ().equals (""))
     	{
     	  fehlerdialog(
     	      Dashboard.sprache.lokal.gibUebersetzung ("allePostfach"),
     	      Dashboard.sprache.lokal.gibUebersetzung ("fehler"));
     	}
     	else
     	{
          plz = txt_postfach_plz.getText ();
          postfach = txt_postfach.getText ();
          nutzer.postfachadresseHinzufuegen (
              txt_postfach_ort.getText (), plz, postfach);
          check_p_postfache.setSelected (true);
          check_p_plz.setSelected (true);
          check_p_ort.setSelected (true);
    	}
      }
   	 	
      /* Wenn Titel nicht gesetzt, dann ignorieren */
      if (txt_titel.getSelectedItem () != null)
      {
	for (Titel g : Titel.values()) 
	{
	  if (g.toString ().equals 
	      (txt_titel.getSelectedItem ().toString ()))
	  {
	    nutzer.setzeTitel (txt_titel.getSelectedItem ().toString ());
	  }
	}
      }
      
      /* Wenn Anrede nicht gesetzt, dann ignorieren */
      if (txt_andrede.getSelectedItem () != null)
      {
	for (Anrede g : Anrede.values()) 
	{
	  if (g.toString ().equals (
	      (txt_andrede.getSelectedItem ().toString ())))
   	  {
	    nutzer.setzeAnrede ((Anrede) g);
   	  }
	}
      }
  
      /*  Es muss nindestens ein Vorname und ein Nachname existieren */
      if (txt_vorname.getText ().equals ("") 
	  && !txt_weitereVornamen.getText ().equals ("Max"))
      {
	check_vorname.setSelected (false);
	pflichfelderAusfuellen ();
      }
      else
      {
	nutzer.setzeVorname (txt_vorname.getText ());
	check_vorname.setSelected (true);
      }
      
      if (txt_weitereVornamen.getText ().equals (""))
      {
	check_w_vorname.setSelected (false);
      }
      else
      {
	nutzer.setzeWeitereVornamen (txt_weitereVornamen.getText ());
	check_w_vorname.setSelected (true);
      }
      
      if (txt_nachname.getText ().equals ("") 
	  && !txt_nachname.getText ().equals ("Mustermann"))
      {
	check_nachname.setSelected (false);
	pflichfelderAusfuellen ();
      }
      else
      {
	nutzer.setzeNachname (txt_nachname.getText ());
	check_nachname.setSelected (true);
      }
      
      /* Wenn Namenszusatz nicht gesetzt, dann ignorieren */
      if (txt_namenszusatz.getSelectedItem () != null)
      {
	for (Namenszusatz g : Namenszusatz.values()) 
	{
	  if (g.toString ().equals 
	      (txt_namenszusatz.getSelectedItem ().toString ()))
	  {
	    nutzer.setzeZusatz ((Namenszusatz) g);
	  }
	}
      }
      
      txt_rechtAusleihedauer.getText (); 
      txt_rechtVerlaengerrungsdauer.getText ();
      
      /* Ausgewaehlte Benutzerart wird gespeichert. */ 
      if (w_nutzerart.getSelectedItem ().toString ()
	  .equals ("Administrator"))
      {
        nutzer.setzeRechte (new RechteAdmin ());
      }
      if (w_nutzerart.getSelectedItem ().toString ()
	  .equals ("Mitarbeiter"))
      {
	nutzer.setzeRechte (new RechteMitarbeiter ());
      }
      if (w_nutzerart.getSelectedItem ().toString ()
	  .equals ("Student"))
      {
        nutzer.setzeRechte (new RechteStudent ());
      }  		
      if (w_nutzerart.getSelectedItem ().toString ().equals (""))
      {
        nutzer.setzeRechte (new RechteStandard ());
      }
  		
      /* Rechte speichern */
      rechtAusleihe = Boolean.parseBoolean 
	  (ausleihe.getSelectedItem ().toString ()); 
      rechtReservieren = Boolean.parseBoolean 
	  (reservieren.getSelectedItem ().toString ());
      rechtStatistik = Boolean.parseBoolean 
	  (rechtstatistik.getSelectedItem ().toString ());
      rechtStand = Boolean.parseBoolean 
	  (rechtStandort.getSelectedItem ().toString ());		
      rechtMahngebuehr = Boolean.parseBoolean 
	  (combo_mahngebuehr.getSelectedItem ().toString ());
      
    	
      nutzer.gibRechte ()
      	.setzAusleihberechtigung (rechtAusleihe);
      nutzer.gibRechte ()
      	.setzeReservierungsberechtigung (rechtReservieren);
      nutzer.gibRechte ()
    	.setzeStatistikBetrachtungsRecht (rechtStatistik);
      nutzer.gibRechte ()
      	.setzeBibVisVerwaltungsRecht (rechtStand);
      nutzer.gibRechte ()
    	.setzeMahngebuehrKassierungsRecht (rechtMahngebuehr);
    }
    catch (NumberFormatException ex)
    {
      System.out.println (ex);
      pflichfelderAusfuellen ();
    }
    catch (UngueltigeEingabeAusnahme ex)
    {
      System.out.println (ex);
      fehlerdialog ();
    }
    catch (Exception ex)
    {
      System.out.println (ex);
      fehlerdialog ();
    }
    sichereDashboard.persVer.datenSpeichern ();
  }
  
  /**
   * Dieser Fehlerdialog soll den Nutzer klar machen, dass 
   * bei der Eingabe etwas schief gelaufen ist.
   */
  private void fehlerdialog ()
  {
    JOptionPane.showConfirmDialog(null,
	Dashboard.sprache.lokal.gibUebersetzung ("beiEingabe") , 
	Dashboard.sprache.lokal.gibUebersetzung ("fehler"), 
        JOptionPane.CLOSED_OPTION);
  }
  
  /** 
   * Dieser Fehlerdialog kann nach belieben angepasst werden.
   * @param grund
   * @param name
   */
  private void fehlerdialog (String grund, String name)
  {
    JOptionPane.showConfirmDialog(null,
        grund , name, 
        JOptionPane.CLOSED_OPTION);
  }
  
  /**
   * Dieser Fehlerdialog wird erzeugt wenn gewisse Felder nicht
   * ausgefuellt sind.
   */
  private void pflichfelderAusfuellen ()
  {
    int eingabe = JOptionPane.showConfirmDialog(null,
        Dashboard.sprache.lokal.gibUebersetzung ("pflichtfeld") , 
        Dashboard.sprache.lokal.gibUebersetzung ("fehler"), 
        JOptionPane.CLOSED_OPTION);
    if (eingabe == JOptionPane.CLOSED_OPTION)
    {
      /* Der Dialog kann weg geklickt werden, aber es passiert 
       * nichts. */
    }
  }
  
  /**
   * 
   * Lehrt alle Felder ausser das Feld der Mahngebuehren und das 
   * ID Feld.
   */
  private void felderLehren ()
  {
    txt_geburtsname.setText ("");
    txt_Telefonnumer.setText (""); 
    txt_email.setText ("");
    txt_adresse.setText ("");
    txt_plz.setText ("");
    txt_vorname.setText ("");
    txt_weitereVornamen.setText ("");
    txt_nachname.setText ("");
    txt_rechtAusleihedauer.setText ("");
    txt_rechtVerlaengerrungsdauer.setText ("");
    txt_mahngebuehr.setText ("0");
  }
  
  /**
   * Macht alle Platzhalter unsichtbar.
   * @param wert
   */
  private void platzhalterSetzen ()
  {
    platzhalter_1.setVisible (false);
    platzhalter_2.setVisible (false); 
    platzhalter_3.setVisible (false);
    platzhalter_4.setVisible (false);
    platzhalter_5.setVisible (false);
    platzhalter_6.setVisible (false);
    platzhalter_7.setVisible (false);
    platzhalter_8.setVisible (false);
    platzhalter_11.setVisible (false);
    platzhalter_12.setVisible (false);
    platzhalter_13.setVisible (false);
    platzhalter_14.setVisible (false);
    platzhalter_15.setVisible (false);
    platzhalter_16.setVisible (false);
    check_g_datum.setVisible (false);
  }
  
  /**
   * Setzt die JCheckBoxen auf einen uebergebenen Wert
   * @param wert
   */
  private void checkBoxensetzen (boolean wert)
  {
    check_g_name.setSelected (wert);
    check_nummer.setSelected (wert);
    check_email.setSelected (wert);
    check_g_datum.setSelected (wert);
    check_adresse.setSelected (wert);
    check_plz.setSelected (wert);
    check_vorname.setSelected (wert);
    check_w_vorname.setSelected (wert);
    check_nachname.setSelected (wert);
    check_hausnummer.setSelected (wert);
    check_strasse.setSelected (wert);
    check_p_ort.setSelected (wert);
    check_p_plz.setSelected (wert);
    check_p_postfache.setSelected (wert);
  }
  
  /**
   * In dieser Methode wird das Geburstdatum abgefragt und
   * wenn es zu einem Fehler kommt werden Fehlerdialoge 
   * erzeugt.
   * @throws Exception
   */
  private void geburtstagsabfrage () throws Exception
  {
    JPanel panel_g_datum = new JPanel ();
    JTextArea info = new JTextArea (
        Dashboard.sprache.lokal.gibUebersetzung ("nutzerAnlegen"));
    JTextField g_tag = new JTextField ();
    
    /* fuer die Festleung der Namen, die Pflichtfelder sind. */
    String vorname = "Max";
    String nachname = "Mustermann";
    
    g_tag.setColumns(15);
    info.setColumns(40);
    
    /* Damit richtig umgebrochen wird. */
    info.setLineWrap(true);
    info.setWrapStyleWord(true);
    
    info.setEditable (false);
    panel_g_datum.add (info, BorderLayout.NORTH);
    panel_g_datum.add (g_tag, BorderLayout.CENTER);
    panel_g_datum.setVisible (true);
    int eingabe = JOptionPane.showConfirmDialog (null, panel_g_datum, "",
        JOptionPane.CLOSED_OPTION);
    
    if (eingabe == JOptionPane.OK_OPTION)
    {
      try
      {
        /* Eingabe darf nicht leer sein */
        if (g_tag.getText ().equals (""))
        {
          fehlerdialog ();
          geburtstagsabfrage ();
          /* Fuehrt dazu das alles andere uebersprungen 
           * wird. Bis an die Stelle an der diese Exception gefangen 
           * wird.
           */
          throw new Exception ();
        }
        else
        {
          /* Datum parsen. */
          Datum datum = DatumParser.
            stringZuDatum (g_tag.getText ());
          check_g_datum.setSelected (true);
          
          /* Muessen ausgefuellt werden */
          vorname = vornameAbfragen ();
          nachname = nachnameAbfragen ();
             
          /* Benutzer erzeugen */
          nutzer = persverw.erzeugeBenutzer (vorname, nachname, datum);
          person.setVisible (true);
        }
      }
      catch (KeinDatumFormat ex)
      {
        person.setVisible (false);
        fehlerdialog ();
        geburtstagsabfrage ();
      }
      catch (UngueltigesDatumAusnahme ex)
      {
        person.setVisible (false);
        fehlerdialog ();
        geburtstagsabfrage ();
      }
      catch (NullPointerException ex)
      {
        person.setVisible (false);
        fehlerdialog ();
        geburtstagsabfrage ();
      }
    }
    if (eingabe == JOptionPane.CLOSED_OPTION)
    {
      /* Benutzeroberflaeche sichtbar machen. */
      person.setVisible (false);
      /* Fuehrt dazu das alles andere uebersprungen 
       * wird. Bis an die Stelle an der diese Exception gefangen 
       * wird.
       */
      throw new Exception ();
    }
    if (eingabe == JOptionPane.CLOSED_OPTION)
    {
      person.setVisible (false);
      throw new Exception ();
    }
  }
  
  /**
   * In dieser Methode wird die ID abgefragt und
   * wenn es zu einem Fehler kommt werden Fehlerdialoge 
   * erzeugt.
   * @throws Exception
   */
  private int idAbfrage () throws Exception
  {
    JPanel id_panel = new JPanel ();
    JTextArea info = new JTextArea (
        Dashboard.sprache.lokal.gibUebersetzung ("nutzerAufrufen"));
    JTextField id_eingabe = new JTextField ();
    int id = 0;
    id_eingabe.setColumns(15);
    info.setColumns(25);
    
    /* Damit richtig umgebrochen wird. */
    info.setLineWrap(true);
    info.setWrapStyleWord(true);
    
    info.setEditable (false);
    id_panel.add (info, BorderLayout.NORTH);
    id_panel.add (id_eingabe, BorderLayout.CENTER);
    id_panel.setVisible (true);
    int eingabe = JOptionPane.showConfirmDialog (null, id_panel, "",
        JOptionPane.OK_CANCEL_OPTION);
    
    if (eingabe == JOptionPane.OK_OPTION)
    {
      try
      {
        /* Eingabe darf nicht leer sein */
        if (id_eingabe.getText ().equals (""))
        {
          fehlerdialog ();
          idAbfrage ();
          throw new Exception ();
        }
        else
        {
          /* ID Parsen */
          id = Integer.parseInt (id_eingabe.getText ());
          platzhalter_1.setSelected (true);
        }
      }
      catch (NumberFormatException ex)
      {
        fehlerdialog (Dashboard.sprache.lokal.gibUebersetzung ("fehler"),
            Dashboard.sprache.lokal.gibUebersetzung ("falscheID"));
        idAbfrage ();
      }
    }
    if (eingabe == JOptionPane.CANCEL_OPTION)
    {
      /* Fuehrt dazu das alles andere uebersprungen 
       * wird. Bis an die Stelle an der diese Exception gefangen 
       * wird.
       */
      throw new Exception ();
    }
    if (eingabe == JOptionPane.CLOSED_OPTION)
    {
      throw new Exception ();
    }
    txt_id.setText (id + "");
    return id;
  }
  
  /**
   * In dieser Methode wird der Vorname abgefragt und
   * wenn es zu einem Fehler kommt werden Fehlerdialoge 
   * erzeugt.
   * @throws Exception
   */
  private String vornameAbfragen () throws Exception
  {
    JPanel vorname_panel = new JPanel ();
    JTextArea info = new JTextArea (
        Dashboard.sprache.lokal.gibUebersetzung ("vorname"));
    JTextField vorname_eingabe = new JTextField ();
    String vorname = "";
    vorname_eingabe.setColumns(15);
    info.setColumns(25);
    
    /* Damit richtig umgebrochen wird. */
    info.setLineWrap(true);
    info.setWrapStyleWord(true);
    
    info.setEditable (false);
    vorname_panel.add (info, BorderLayout.NORTH);
    vorname_panel.add (vorname_eingabe, BorderLayout.CENTER);
    vorname_panel.setVisible (true);
    int eingabe = JOptionPane.showConfirmDialog (null, vorname_panel, "",
        JOptionPane.OK_CANCEL_OPTION);
    
    if (eingabe == JOptionPane.OK_OPTION)
    {
      try
      {
        /* Eingabe darf nicht leer sein */
        if (vorname_eingabe.getText ().equals (""))
        {
          fehlerdialog ();
          vornameAbfragen ();
        }
        else
        {
          vorname = vorname_eingabe.getText ();
          platzhalter_1.setSelected (true);
        }
      }
      catch (NumberFormatException ex)
      {
        fehlerdialog ();
        vornameAbfragen ();
      }
    }
    if (eingabe == JOptionPane.CANCEL_OPTION)
    {
      /* Fuehrt dazu das alles andere uebersprungen 
       * wird. Bis an die Stelle an der diese Exception gefangen 
       * wird.
       */
      throw new Exception ();
    }
    if (eingabe == JOptionPane.CLOSED_OPTION)
    {
      throw new Exception ();
    }
    return vorname;
  }
  
  
  /**
   * In dieser Methode wird das Nachname abgefragt und
   * wenn es zu einem Fehler kommt werden Fehlerdialoge 
   * erzeugt.
   * @throws Exception
   */
  private String nachnameAbfragen () throws Exception
  {
    JPanel nachname_panel = new JPanel ();
    JTextArea info = new JTextArea (
        Dashboard.sprache.lokal.gibUebersetzung ("nachname"));
    JTextField nachname_eingabe = new JTextField ();
    String nachname = "";
    nachname_eingabe.setColumns(15);
    info.setColumns(25);
    
    /* Damit richtig umgebrochen wird. */
    info.setLineWrap(true);
    info.setWrapStyleWord(true);
    
    info.setEditable (false);
    nachname_panel.add (info, BorderLayout.NORTH);
    nachname_panel.add (nachname_eingabe, BorderLayout.CENTER);
    nachname_panel.setVisible (true);
    int eingabe = JOptionPane.showConfirmDialog (null, nachname_panel, "",
        JOptionPane.OK_CANCEL_OPTION);
    
    if (eingabe == JOptionPane.OK_OPTION)
    {
      try
      {
        /* Eingabe darf nicht leer sein */
        if (nachname_eingabe.getText ().equals (""))
        {
          fehlerdialog ();
          nachnameAbfragen ();
        }
        else
        {
          nachname = nachname_eingabe.getText ();
          platzhalter_1.setSelected (true);
        }
      }
      catch (NumberFormatException ex)
      {
        fehlerdialog ();
        nachnameAbfragen ();
      }
    }
    if (eingabe == JOptionPane.CANCEL_OPTION)
    {
      throw new Exception ();
    }
    if (eingabe == JOptionPane.CLOSED_OPTION)
    {
      /* Fuehrt dazu das alles andere uebersprungen 
       * wird. Bis an die Stelle an der diese Exception gefangen 
       * wird.
       */
      throw new Exception ();
    } 
    return nachname;
  }
  
  /**
   * Gibt ein JFrame zurueck, damit dieses von einer anderen Klasse 
   * wieder geschlossen werden kann. 
   * @return
   */
  public JFrame gibPerson ()
  {
    return person;
  }
}